#使用pca将原本的四维的特征降解为2维
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
class pca:

    def __init__(self,n):
        #这个地方n表示的就是我想要降解到的维度
        self.n=n
        self.component=None#保存主成分
        self.mean=None
        self.variance=None
    def cal_pca(self,X):
        #首先对X矩阵进行去中心化
        self.mean=np.mean(X,axis=0)
        x_decenter=X-self.mean
        #求出该矩阵对应的协方差矩阵
        x_cov=np.cov(x_decenter,rowvar=False)#按照列来计算
        #计算x_cov的特征值和特征向量
        value,vectors=np.linalg.eigh(x_cov)
        #把特征值按照降序排列
        sort_index=np.argsort(value)[::-1]
        sort_vectors=vectors[:,sort_index]
        sort_value=value[sort_index]
        #选择对应的前n个特征向量
        self.component=vectors[:,:self.n]
        return self
    def transfor(self,X):
        #现在需要将数据进行投影即可
        x_center=X-np.mean(X)
        t=np.dot(x_center,self.component)
        return t
if __name__ == "__main__":
    data = pd.read_csv('new_wine.csv')
    
    # 创建PCA实例
    pca_model = pca(n=2)
    
    # 计算PCA并转换数据
    pca_model.cal_pca(data.values)
    transformed_data = pca_model.transfor(data.values)
    
    # 将转换后的数据保存为CSV文件
    pd.DataFrame(transformed_data).to_csv('data_pca.csv', index=False)